package com.vates.vsp.servicios.cliente;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.vates.vsp.dao.DaoBaseCliente;
import com.vates.vsp.entidades.Cliente;
import com.vates.vsp.exceptions.ClienteExistException;
import com.vates.vsp.exceptions.ClienteNoExistException;
import com.vates.vsp.exceptions.ValidationException;
import com.vates.vsp.util.ValidadorCampos;

@Service(value = "clienteSrv")
public class ClienteServiceImpl implements ClienteService {

	@Autowired
	private DaoBaseCliente dao;

	@Override
	public void altaCliente(Cliente cliente) throws ClienteExistException, ValidationException {
		// antes de guardar el cliente se verifica si existe alguno con el mismo nombre
		if (ValidadorCampos.validarCliente(cliente) && dao.buscarPorNombre(cliente.getNombre()) == null)
			if (dao.buscarPorNif(cliente.getNif()) == null)
				dao.guardar(cliente);
			else
				throw new ClienteExistException("El cliente con el nif " + cliente.getNif() + " ya existe");
		else
			throw new ClienteExistException("El cliente con el nombre " + cliente.getNombre() + " ya existe");
	}

	@Override
	public void bajaCliente(Cliente cliente) throws ClienteNoExistException {
		// antes de eliminar verifico si existe el cliente
		if (dao.buscarPorNombre(cliente.getNombre()) != null)
			dao.eliminar(cliente);
		else
			throw new ClienteNoExistException();
	}

	@Override
	public void actualizarCliente(Cliente cliente, String nombreOriginal) throws ClienteNoExistException, ValidationException, ClienteExistException {
		if (ValidadorCampos.validarCliente(cliente) && dao.buscarPorId(cliente.getIdCliente()) != null)
			if(cliente.getNombre().equalsIgnoreCase(nombreOriginal))
				dao.guardar(cliente);
			else {
				if(dao.buscarPorNombre(cliente.getNombre()) == null)
					dao.guardar(cliente);
				else
					throw new ClienteExistException();
			}
				
		else
			throw new ClienteNoExistException();
	}

	@Override
	public List<Cliente> buscarTodosClientes() {
		return dao.buscarTodos();
	}

	@Override
	public Cliente buscarClientePorId(Long idCliente) throws ClienteNoExistException {
		if(dao.buscarPorId(idCliente) != null)
			return dao.buscarPorId(idCliente);
		else
			throw new ClienteNoExistException();
	}

	public Cliente buscarClientePorNombre(String nombreCliente) throws ClienteNoExistException {
		if(dao.buscarPorNombre(nombreCliente) != null)
			return dao.buscarPorNombre(nombreCliente);
		else
			throw new ClienteNoExistException();
	}

	@Override
	public Cliente buscarClientePorNif(String nif) throws ClienteNoExistException {
		if(dao.buscarPorNif(nif) != null)
			return dao.buscarPorNif(nif);
		else
			throw new ClienteNoExistException();
	}

}
